# 正则表达式
import re

# 匹配单个字符
# 匹配单个字符
# 匹配单个字符

# re.match("表达式","匹配的字符串")  必须从头开始匹配
# re.match("表达式","匹配的字符串")  必须从头开始匹配
# re.match("表达式","匹配的字符串")  必须从头开始匹配

ma = re.match("wen", "wenchao")  # 匹配以 wen 开始的字符串,从开始位置匹配. 不是 wen开始的返回 none
print("匹配以wen 开始的字符串:", ma.group())

#  "."  匹配任意一个字符,除了 \n以外  --常用
res = re.match('.e', "wenchao")  # ".e" 表示第一位任意数字,第二位是 e
print(". 匹配任意一个字符:", res.group())

# [] 匹配 []中出现的字符  --常用
res1 = re.match("[we]", "wenchao")  # 以[]内 任务的单词为开始的字符串都可以
print("匹配[]中出现的字符为开始的字符串", res1.group())

# 匹配 0123456789 的写法
res3 = re.match("[0-9]", "125")
res33 = re.match("\d", "125")
print("[0-9] 匹配0~9:", res3.group())
print("\d 匹配0~9:", res33.group())

# 匹配非数字
res44 = re.match("\D", "a125")
print("\D 匹配非数字", res44)

# 匹配 0-4 6-9的写法
res4 = re.match("[0-46-9]", "4")
print("[0-46-9]  匹配 0-4 6-9", res4.group())

# 匹配 全部单词写法
res5 = re.match("[a-zA-Z]", "as")
print("[a-zA-Z] 匹配全部单词:", res5.group())

# \s 匹配空格 和 tab键
res6 = re.match("\s.", " a   ")
print("\s 匹配空格 和 tab键:", res6)

# \S 匹配非空格
res7 = re.match("\S", "as   ")
print("\S 匹配非空格:", res7)

# \w 匹配单词字符 , 即 a-zA-Z,0-9,_,汉字
res8 = re.match("\w", "as")
print("\w 匹配单词字符 , 即 a-zA-Z,0-9,_,汉字:", res8)

# \W 匹配非单词字符
res9 = re.match("\W", "$._AS")
print("\W 匹配非单词字符:", res9)

# 匹配多个字符
# 匹配多个字符
# 匹配多个字符

# * 匹配前一个字符出现0次或N次,可有可无
# + 匹配前一个字符出现1次或N次,至少一次
# ? 匹配前一个字符出现 0次或一次
# {m} 匹配前一个字符出现m次
# {m,n} 匹配前一个字符出现m~n次

let = re.match("d*", "ddddad")
print("d*:", let.group())

let1 = re.match("c+", "ccchao")
print("+:", let1)

let2 = re.match("c?", "cccccchao")
print("?:", let2)

let3 = re.match("c{3}", "cccccchao")
print("{m}:", let3)

let4 = re.match("c{3,5}", "ccchao")
print("{m,n}:", let4)

# 匹配开头 ^, 还有取反
let5 = re.match("^c", "chao")
print("^ 匹配开头:", let5)

# [^]匹配不以...开头
let6 = re.match("[^c]", "ycwhao")
print("[^]匹配不以...开头:", let6)

# $ 匹配结果
let7 = re.match(".*p$", "scp")
print("$ 匹配以...结尾", let7)

# 匹配分组
# 匹配分组
# 匹配分组
# | 匹配左右任意一个表达式  ,先左后右
let8 = re.match("\d|\w", "ab")
print(" | 匹配左右任意一个表达式  ,先左后右", let8)

# (ab) 将括号中字符串作为一个分组
let9 = re.match("\w*@(163|qq|126).com", "1234@163.com")
print("(ab) 将括号中字符串作为一个分组", let9)

# \num 与 (ab)配合使用
let9 = re.match(r"<(\w*)>\w*</\1>", "<html>login</html>")
print(r"\num 与 (ab)配合使用", let9)

# re.search("pattern","search") 匹配整个字符串,将符合条件的第一个字符返回
# re.search("pattern","search") 匹配整个字符串,将符合条件的第一个字符返回
# re.search("pattern","search") 匹配整个字符串,将符合条件的第一个字符返回
const = re.search("\w", "popasd")
print("匹配整个字符串,将符合条件的第一个字符返回:", const)

# re.findall("pattern"<"str") 从头到尾匹配,找到所有匹配成功的数据,返回一个列表
# re.findall("pattern"<"str") 从头到尾匹配,找到所有匹配成功的数据,返回一个列表
# re.findall("pattern"<"str") 从头到尾匹配,找到所有匹配成功的数据,返回一个列表
const = re.findall("\w", "popasd")
print("从头到尾匹配,找到所有匹配成功的数据,返回一个列表:", const)

# re.sub(pattern,repl,string,count) 将匹配到的字符串替换
# re.sub(pattern,repl,string,count) 将匹配到的字符串替换
# re.sub(pattern,repl,string,count) 将匹配到的字符串替换
const1 = re.sub("c", "yy", "chaoc")
const2 = re.sub("c", "yy", "chaoc", 1)
print("将匹配到的字符串替换:", const1)
print("将匹配到的字符串替换1次:", const2)

# re.split(pattern,string,maxsplit) 将匹配到的字符串 分隔
# re.split(pattern,string,maxsplit) 将匹配到的字符串 分隔
# re.split(pattern,string,maxsplit) 将匹配到的字符串 分隔


# 贪婪与非贪婪匹配
# 贪婪与非贪婪匹配
# 贪婪与非贪婪匹配

# 贪婪(默认): 满足匹配条件时,匹配尽可能长的字符串
# 非贪婪: 满足匹配条件时,匹配尽可能短的字符串,用 ? 表示非贪婪匹配
